package leetcode_ago.LinearList;
/**
 *输入一个链表，输出该链表中倒数第k个节点。
 *为了符合大多数人的习惯，本题从1开始计数，即链表的尾节点是倒数第1个节点。
 * 例如，一个链表有 6 个节点，从头节点开始，它们的值依次是 1、2、3、4、5、6。这个链表的倒数第 3 个节点是值为 4 的节点
 */

/**
 * 思路：快慢指针--fast先走k步，fast与low相对距离是k，fast走到null slow就到倒数第k的节点
 * 注意判断k的合法性
 */
public class NumJZ22_GetKFromEnd {
    public ListNode getKthFromEnd(ListNode head, int k) {
        //判断k的合法性
        ListNode node=head;
        for (int i = 0; i < k; i++) {
            if(node==null){
                System.out.println("k illegal");
                return head;
            }
            node=node.next;
        }
        //此时k合法存在
        ListNode fast=head;
        for (int i = 0; i < k; i++) {
            fast=fast.next;//fast先走k步
        }
        ListNode slow=head;
        while(fast!=null){
            fast=fast.next;
            slow=slow.next;
        }
        return slow;
    }
}
